# -*- coding: utf-8 -*-
""" Managers que manejan un subconjunto de objetos. """
from django.db import models
from django.db.models import Q


class FilterManager(models.Manager):
    """
    Este manager es inicilizado con un diccionario con el queryset que será
    usado para filtrar objetos usando filter().

    Ej:
    class AModel(models.Model):
        # ... fields etc...
        objects = models.Manager()
        live_objects = FilterManager({'is_public': True, 'published__gte': datetime.datetime.now})

    """
    def __init__(self, query_dict):
        super(FilterManager, self).__init__()
        self.query_dict = query_dict

    def get_q(self, query_dict):
        """
        Genera un Q object para el query_dict pasado como parámetro. Si alguno
        de los values del dict es un callable se lo llama.
        """
        for k in query_dict.keys():
            if callable(query_dict[k]):
                query_dict[k] = query_dict[k]()
        return Q(**query_dict)

    def get_query_set(self):
        return super(FilterManager, self).get_query_set().filter(self.get_q(self.query_dict))
